package com.example.java.zuo.新手班.class01;

/**
 * @Author : 佩萁
 * Description :
 * @Create : 2023/12/13 - 13:31
 */
public class Code06_InsertionSort {
    //一(3)插入排序
    public static void insertSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        //插入排序就是在i位置的元素和它前一位作比较，如果它比它前一位小，就交换，直到交换不了，然后i位置所在的元素就此不动，它前面的都已经排序好了
        int N = arr.length;
        for (int end = 1; end < N; end++) {
            int newNumIndex = end;
            while (newNumIndex - 1 >= 0 && arr[newNumIndex - 1] > arr[newNumIndex]) {
                swap(arr, newNumIndex, newNumIndex - 1);
                newNumIndex--;
            }
        }
    }

    //一(4)插入排序写法二
    public static void insertSort2(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        int N = arr.length;
        for (int end = 1; end < N; end++) {
            for (int pre = end - 1; pre >= 0 && arr[pre] > arr[pre + 1]; pre--) {
                swap(arr, pre, pre + 1);
            }
        }
    }

    //二:交换函数
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
    }

    //三:打印函数
    public static void printArray(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }

    public static void main(String[] args) {
        int[] arr = {7, 1, 3, 5, 1, 6, 8, 1, 3, 5, 7, 5, 9};
        //排序前
        printArray(arr);
        System.out.println();
        //插入排序
        insertSort(arr);
//        insertSort2(arr);
        //排序后
        printArray(arr);
    }
}